package edu.yngsxy.communityservice.core.security;

import cn.dev33.satoken.context.SaHolder;
import cn.dev33.satoken.interceptor.SaInterceptor;
import cn.dev33.satoken.jwt.StpLogicJwtForMixin;
import cn.dev33.satoken.router.SaRouter;
import cn.dev33.satoken.stp.StpLogic;
import cn.dev33.satoken.stp.StpUtil;
import lombok.extern.slf4j.Slf4j;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.servlet.config.annotation.InterceptorRegistry;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;

/**
 * [Sa-Token 权限认证] 配置类
 */
@Configuration
@Slf4j // 自动生成log日志对象
public class SaTokenConfigure implements WebMvcConfigurer {

    // 注册拦截器

    /**
     * 注册Sa-Token的拦截器，并进行权限验证。将路径中/api/v../user/get（v.. 包括 v1、v2、v3.1 等版本格式）转换为权限名称 user:get，并进行权限验证
     * @param registry
     */
    @Override
    public void addInterceptors(InterceptorRegistry registry) {
        registry.addInterceptor(new SaInterceptor(handle -> {
            // 遍历校验规则，依次鉴权
            SaRouter.match("/api/**", r -> {
                // 获取请求路径并处理
                String path = SaHolder.getRequest().getRequestPath().toLowerCase();
              // 正则替换：匹配 /api/v+数字(可选.数字)/ 开头的部分，替换为空
                String processedPath = path.replaceAll("^/api/v\\d+(\\.\\d+)?/", "");
                // 再将剩余路径中的 / 替换为 :
                processedPath = processedPath.replace("/", ":");//原始路径 处理后结果/api/v1/users/list->users:list
                        // /api/v2/order/get/1 -> order:get:1
                        // /api/v3.1/logs  -> logs
                        // /api/v10.2.3/test -> test
                        // /other/path  -> other:path （不匹配/api/v*，仅替换/为:
                log.info("SaTokenConfigure----要求权限：----" + processedPath);
                StpUtil.checkPermission(processedPath);
            });
        })).addPathPatterns("/api/**");
    }

    // Sa-Token 整合 jwt (Mixin 混入模式)
    @Bean
    public StpLogic getStpLogicJwt() {
        return new StpLogicJwtForMixin();
    }

}
